#include "head.h"

typedef struct train_s
{
    int len;
    int buf[1000];
}train_t;

// 参数：用来和客户端指定交互的net_fd
int SendFile(int net_fd)
{
    // 声明对象
    train_t file_name;
    bzero(&file_name, sizeof(file_name));

    // 传文件名和文件名的长度 加边界 以防止粘包问题
    char *str = "./1b.txt";
    printf("正在传输\n");
    memcpy(file_name.buf, str, strlen(str));// 将文件名cp给file_name.buf缓冲区
    file_name.len = strlen(str);    // 文件名长度
    send(net_fd, &file_name, sizeof(int) + file_name.len, MSG_NOSIGNAL);

    // 发送文件内容
    int file_fd = open(str, O_RDWR);
    ERROR_CHECK(file_fd, -1, "open");
    // 获取文件大小
    struct stat st;
    memset(&st, 0, sizeof(st));
    fstat(file_fd, &st);    // fstat(net_fd, &st);  此时会出现文件大小为0的情况，因为传输的是net_fd

    printf("%ld\n", st.st_size);    // 查看发送端的文件大小是否传输正确
    send(net_fd, &st.st_size, sizeof(off_t), MSG_NOSIGNAL);
    
    // 使用sendfile实现零拷贝
    sendfile(net_fd, file_fd, NULL, st.st_size);

    // 关闭文件描述符
    close(file_fd);
    return 0;
}
